perm filename HUNK.RPG[UP,DOC] blob sn#243613 filedate 1976-10-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002				      HUNKS PACKAGE
C00012 ENDMK
C⊗;
			      HUNKS PACKAGE

    THE HUNKS PACKAGE PROVIDES LISP WITH A KIND OF "RECORD" OR
    "SMALL VECTOR" FEATURE.  THE HUNK DATA TYPE INTERACTS SMOOTHLY
    WITH THE LIST DATA TYPE TO PROVIDE SOME INTERESTING CAPABILITIES.
    THE HUNKS PACKAGE IS ONLY AVAILABLE IN BIBOP LISPS.

	 [A] A NEW DATA TYPE IS INTRODUCED INTO LISP, THE "HUNK".
	     HUNKS ARE SHORT VECTORS OF S-EXPRESSIONS.  IN THE CURRENT
	     IMPLEMENTATION THERE ARE ACTUALLY SEVERAL SPACES OF
	     FOR HUNKS, VARIOUSLY CALLED HUNK4, HUNK8, HUNK16, ETC.
	     THESE WILL BE EXPLAINED IN DETAIL BELOW.  IN SOME
	     CONTEXTS ORDINARY LIST CELLS ARE CONSIDERED TO BE HUNKS
	     OF LENGTH 2.  HUNKS ARE NOT CONSIDERED TO BE ATOMS;
	     (ATOM H) RETURNS NIL FOR ANY HUNK H.

	 [B] (HUNKP X) IS A PREDICATE WHICH RETURNS T IFF X IS A HUNK.
		IN THIS CONTEXT A LIST CELL IS NOT CONSIDERED TO BE A HUNK.

	     (CXR N H) RETURNS THE N'TH ELEMENT OF THE HUNK H, FOR 1≤N.
		(CXR 0 H) RETURNS THE LAST ELEMENT OF H.
		(CXR 1 H) IS EQUIVALENT TO (CAR H), AND (CXR 0 H)
		IS EQUIVALENT TO (CDR H); IN FACT, THE CAR AND CDR
		FUNCTIONS MAY BE USED ON HUNKS AS WELL AS ON LISTS.

	     (RPLACX N H Z) REPLACES THE N'TH COMPONENT OF H WITH Z FOR 1≤N.
		(RPLACX 0 H Z) REPLACES THE LAST ELEMENT OF H WITH Z.
		THE VALUE OF RPLACX IS ITS (MODIFIED) SECOND ARGUMENT.
		(RPLACX 1 H Z) IS EQUIVALENT TO (RPLACA H Z),
		AND (RPLACX 0 H Z) IS EQUIVALENT TO (RPLACD H Z).

	     (MAKHUNK N) CREATES A HUNK OF SIZE N AND RETURNS IT.
		(MAKHUNK 0) RETURNS NIL, AND (MAKHUNK 1) OR (MAKHUNK 2)
		RETURNS A LIST CELL.  ALL COMPONENTS ARE INITIALIZED
		TO NIL.  THE COMPONENTS ARE NUMBERED 1, 2, ..., N-1, 0.
                IT ALSO HAS AN EXTENDED DEFINITION:  IF THE ARGUMENT TO
                MAKHUNK IS A FIXNUM, IT CREATES A HUNK THAT BIG FILLED
                WITH NILS.  IF THE ARGUMENT IS A LIST, IT CREATES A HUNK
                FILLED WITH THE ELEMENTS OF THE LIST.  THUS

         	(MAKHUNK (LIST A B C D)) = (HUNK A B C D)

	     (HUNK A1 A2 ... AN-1 A0) IS EQUIVALENT TO
			((LAMBDA (H)
				 (RPLACX 0 H A0)
				 ...
				 (RPLACX N-1 H AN-1))
			 (MAKHUNK N))

		THAT IS, IT CREATES A HUNK WHOSE COMPONENTS ARE THE
		ARGUMENTS TO HUNK.  NOTE THAT, AS FUNNY BOUNDARY
		CASES, (HUNK) RETURNS NIL, AND (HUNK X)
		IS THE SAME AS (NCONS X).

	     (HUNKSIZE H) RETURNS THE NUMBER OF COMPONENTS IN
	     THE HUNK H.  HUNKSIZE OF A LIST CELL IS 2. NIL IS NOT
	     CONSIDERED A HUNK.

	 [C] EQUAL WILL COMPARE HUNKS BY DOING A RECURSIVE
	     COMPONENT BY COMPONENT COMPARISON.  SXHASH WILL
	     COMPUTE THE HASH ON THE BASIS OF ALL COMPONENTS.

	 [D] HUNKS ARE PRINTED USING AN EXTENSION TO DOT NOTATION
	     SUGGESTED BY RMS.  SINCE LIST CELLS ARE CONSIDERED TO
	     BE 2-HUNKS, AND ARE PRINTED AS (CAR . CDR), THE RESULT
	     OF (HUNK A0 A1 A2 +++ AN-2 AN-1) IS PRINTED AS
	     (A0 . A1 . A2 . +++ . AN-2 . AN-1 ), WHERE "+++"
	     IS USED AS AN ELLIPSIS TO AVOID CONFUSION WITH THE
	     DOT NOTATION.  THUS WE HAVE:

		(HUNK 0) => (0)
		(HUNK 0 1) => (0 . 1)
		(HUNK 0 1 2) => (0 . 1 . 2)
		(HUNK 0 1 2 3) => (0 . 1 . 2 . 3)

	     NOTE ALSO THAT SINCE (HUNK 1) => (1),
	     (HUNK 0 (HUNK 1)) => (0 . (1))=> (0 1)
	     AND (HUNK (HUNK 0) 1) => ((0) . 1)
	     THEREFORE (HUNK 0 (HUNK 1 (HUNK 2 (HUNK 3)))) IS EQUIVALENT
	     TO (LIST 0 1 2 3)

	 [E] MOST OTHER FUNCTIONS WHICH OPERATE ON LIST STRUCTURE
	     WILL TREAT HUNKS AS LIST CELLS, USING ONLY THE FIRST
	     TWO POINTERS.  (IN PARTICULAR, SUBST AND SUBLIS DO
	     NOT PRESENTLY KNOW ANYTHING SPECIAL ABOUT HUNKS;
	     HENCE (SUBST NIL NIL H) WILL NOT COPY A HUNK!)
	     EVAL ALSO TREATS HUNKS AS LIST CELLS; THUS THE EXPRESSION

		(PLUS . FIXNUM . SIMP  1  2  3)

	     {CREATED BY SAYING "(HUNK 'PLUS 'FIXNUM 'SIMP 
					(HUNK 1 (HUNK 2 (HUNK 3))))"}
	     EVALUATES TO 6, IGNORING "FIXNUM" AND "SIMP".
	     IMAGINE THE POSSIBILITIES FOR HACKING!

        [F]  HUNKS ARE ALLOCATED IN SPACES CALLED HUNK4, HUNK8, ETC.
	     HUNKS WHICH RESIDE IN HUNK4 SPACE ARE ALL OF LENGTH 4, HUNKS
	     IN HUNK8 SPACE ARE OF LENGTH 8, AND SO ON. WHEN YOU ASK FOR
 	     A HUNK OF LENGTH 3, FOR INSTANCE, YOU ARE GIVEN A HUNK IN HUNK4
	     SPACE.


				WHY HUNKS?

	HUNKS WERE INVENTED SOLELY TO SOLVE THE PROBLEM OF LIMITED
ADDRESS SPACE. WHEN YOU HAVE MANY SMALL CLUMPS OF DATA ("SMALL" = 5
TO 20 POINTERS), THEN HUNKS CAN REDUCE STORAGE BY A FACTOR OF 2 OVER
LISTS, AND THEY DON'T HAVE THE 6 TO 8 WORDS OF HEADER REQUIRED BY A
FULL-FLEDGED ARRAY. ON THE OTHER HAND, HUNKS ARE HARDER TO ALLOCATE
THAN LISTS, AND LESS FLEXIBLE THAN ARRAYS.